﻿// --------------------------------------------------------------------------------------------------------------------
// <copyright file="CollectionHelper.cs" company="Donga CS">
//   2011
// </copyright>
// <summary>
//   Collection Helper
// </summary>
// --------------------------------------------------------------------------------------------------------------------



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Data;

namespace DTTB.Common
{
    public class CollectionHelper
    {
        private CollectionHelper()
        {
        }

        public static DataTable ConvertTo<T>(IList<T> list)
        {
            DataTable table = CreateTable<T>();
            Type entityType = typeof(T);
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);

            foreach (T item in list)
            {
                DataRow row = table.NewRow();

                foreach (PropertyDescriptor prop in properties)
                {
                    row[prop.Name] = prop.GetValue(item);
                }

                table.Rows.Add(row);
            }

            return table;
        }

        public static IList<T> ConvertTo<T>(IList<DataRow> rows)
        {
            IList<T> list = null;

            if (rows != null)
            {
                list = new List<T>();

                foreach (DataRow row in rows)
                {
                    T item = CreateItem<T>(row);
                    list.Add(item);
                }
            }

            return list;
        }

        public static IList<T> ConvertTo<T>(DataTable table)
        {
            if (table == null)
            {
                return null;
            }

            List<DataRow> rows = new List<DataRow>();

            foreach (DataRow row in table.Rows)
            {
                rows.Add(row);
            }

            return ConvertTo<T>(rows);
        }

        public static T CreateItem<T>(DataRow row)
        {
            T obj = default(T);
            if (row != null)
            {
                obj = Activator.CreateInstance<T>();

                foreach (DataColumn column in row.Table.Columns)
                {
                    PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName);
                    //try
                    //{
                    //    object value = row[column.ColumnName];
                    //    prop.SetValue(obj, value, null);
                    //}
                    //catch (Exception ex)
                    //{ }
                    object value = row[column.ColumnName];//test
                    try
                    {
                        prop.SetValue(obj, value, null);
                    }
                    catch (Exception ex)
                    {
                        try
                        {   // String == null
                            prop.SetValue(obj, String.Empty, null);
                        }
                        catch (Exception)
                        {
                            try
                            {   // int == null
                                prop.SetValue(obj, 0, null);
                            }
                            catch (Exception)
                            {
                                try
                                {   // Bitmap type
                                    Byte[] bytes = new byte[1];
                                    prop.SetValue(obj, bytes, null);
                                }
                                catch (Exception)
                                {
                                    // Datetimme == null
                                    prop.SetValue(obj, DateTime.MinValue, null);
                                }
                            }
                            
                        }
                       
                    }
                    
                    
                   
                }
            }

            return obj;
        }

        public static DataTable CreateTable<T>()
        {
            Type entityType = typeof(T);
            DataTable table = new DataTable(entityType.Name);
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);

            foreach (PropertyDescriptor prop in properties)
            {
                table.Columns.Add(prop.Name, prop.PropertyType);
            }

            return table;
        }
    }

}
